/**
6.条件如下：
1)一群人围在一起坐成环状（如：N个人，人员编号从1~N）；
2)从某个编号开始报数（如：从第K个人开始报数）；
3)数到某个数（如：从第K个人开始数M个数，第M个人出列）的时候，此人出列，下一个人重新报数；
4)一直循环，直到所有人出列  ，结束。

在上述条件下，编码在控制台顺序打印出列人员。
 */

 function con(n,k,m){
    var arr=getArr(n);
    recursion(arr,n,k,m);
 }
 //规律：
 function getArr(n){
     let arr=[]
     for(let i=1;i<=n;i++){
        arr.push(i);
     }
     return arr;
 }
 function recursion(arr=[],n,k,m){
    var indexFlag=m%n;//m对n 取余，是计算转几圈后，第几个人出局；

     //因为是从k个人开始数的，所以上步的取余要在k的基础上增加；
     //同样k+indexFlag-1有可能超出了n的限制，所以当溢出后，要再从数组头部开始计数
    var index=k+indexFlag-1>n?k+indexFlag-n-1:k+indexFlag-1;
   
    //特殊情况：当余数是0；也就是这个时候，出局的是k前面的人；index是k-1；
    //但是k有可能是数组第一个；所以也要修正下，这个时候，k前面的人实际是数组最后一个人；
    index-=1;
    index=index<0?n+index:index;   
    //打印出局的人的编号；以及数组中的下标
    console.log(arr[index],index);
    //移除已经出局的人
    arr.splice(index,1);
    //当数组中还有人时，继续递归移除
    if(n>1){
        // console.log(arr,n-1,index+1,m);
        recursion(arr,n-1,index+1,m);
    }
 }
 con(5,2,2)

